package main

import "fmt"

// ==========类型断言==========

type Student struct {
	Name string
}

func AssertFunc(args ...interface{}) {
	for _, v := range args {
		switch x := v.(type) { // .(type)只能在switch中使用, type是一个关键字, 固定写法, x和v都是interface{}类型, 需要转换
		case int, int8, int16, int32, int64:
			fmt.Println("整型", v)
		case float32, float64:
			fmt.Println("浮点型", x)
		case bool:
			fmt.Println("布尔类型", x)
		case string:
			fmt.Println("字符串类型", x)
		default:
			fmt.Println("不支持的类型", x)
		}
	}
}

func main() {
	var a interface{}  //  变量a是一个空接口, 可以接收任意类型变量
	a = Student{"Max"} // 将Student结构体变量赋给空接口变量a
	var b Student
	b = a.(Student) // 通过类型断言将接口a转换成Student类型, 如果a指向的不是Student类型, 则该转换操作会报错
	fmt.Println(b)

	// 带检查的类型断言
	c, ok := a.(Student)
	if ok {
		fmt.Println("转换成功", c)
	} else {
		fmt.Println("转换失败")
	}

	AssertFunc(1, 1.1, "123", true)
}
